/**
 * SSD1306 OLED显示屏驱动头文件
 * 0.96寸 128x64分辨率 I2C接口
 */

#ifndef __SSD1306_H
#define __SSD1306_H

#include "stm32f10x.h"

// OLED尺寸定义
#define SSD1306_WIDTH           128
#define SSD1306_HEIGHT          64

// SSD1306 I2C地址
#define SSD1306_I2C_ADDR        0x78  // 7位地址: 0x3C, 左移1位

// SSD1306命令定义
#define SSD1306_CMD             0x00
#define SSD1306_DATA            0x40

// 基本命令
#define SSD1306_SET_CONTRAST    0x81
#define SSD1306_DISPLAY_ALL_ON  0xA4
#define SSD1306_DISPLAY_ALL_OFF 0xA5
#define SSD1306_DISPLAY_NORMAL  0xA6
#define SSD1306_DISPLAY_INVERSE 0xA7
#define SSD1306_DISPLAY_OFF     0xAE
#define SSD1306_DISPLAY_ON      0xAF

// 滚动命令
#define SSD1306_SCROLL_RIGHT    0x26
#define SSD1306_SCROLL_LEFT     0x27
#define SSD1306_SCROLL_OFF      0x2E

// 字体大小定义
typedef enum {
    Font_6x8,
    Font_7x10,
    Font_11x18,
    Font_16x26
} FontDef;

// 字体结构体
typedef struct {
    const uint8_t *data;
    uint8_t width;
    uint8_t height;
    uint8_t bytes;
} Font;

// 函数声明
void SSD1306_Init(void);
void SSD1306_Clear(void);
void SSD1306_UpdateScreen(void);
void SSD1306_SetCursor(uint8_t x, uint8_t y);
void SSD1306_WriteChar(char ch, FontDef font);
void SSD1306_WriteString(char *str, FontDef font);
void SSD1306_DrawPixel(uint8_t x, uint8_t y, uint8_t color);
void SSD1306_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color);
void SSD1306_DrawRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color);
void SSD1306_DrawBitmap(uint8_t x, uint8_t y, const uint8_t *bitmap, uint8_t w, uint8_t h);

// 字体声明
extern Font Font_6x8_data;
extern Font Font_7x10_data;
extern Font Font_11x18_data;
extern Font Font_16x26_data;

#endif
